/*
* Copyright (c) 2012 Data Harmonisation Panel
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.ui.compatibility;
import java.util.List;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.menus.WorkbenchWindowControlContribution;
import de.fhg.igd.eclipse.util.extension.exclusive.ExclusiveExtension.ExclusiveExtensionListener;
import eu.esdihumboldt.hale.common.align.compatibility.CompatibilityMode;
import eu.esdihumboldt.hale.common.align.model.Cell;
import eu.esdihumboldt.hale.ui.common.CommonSharedImages;
import eu.esdihumboldt.hale.ui.common.service.compatibility.CompatibilityModeFactory;
import eu.esdihumboldt.hale.ui.common.service.compatibility.CompatibilityService;
import eu.esdihumboldt.hale.ui.common.service.compatibility.CompatibilityServiceListener;
/**
* UI Composite containing elements displaying the current compatibility mode
* and its status
*
* @author Sebastian Reinhardt
*/
public class CompatibilityModeComposite extends WorkbenchWindowControlContribution {
CompatibilityService cs;
ExclusiveExtensionListener<CompatibilityMode, CompatibilityModeFactory> modeListener;
CompatibilityServiceListener compListener;
/**
* standard constructor, retrieves the current compatibility service
*/
public CompatibilityModeComposite() {
super();
this.cs = PlatformUI.getWorkbench().getService(CompatibilityService.class);
}
/**
* standard constructor with id
*
* @param id the id
*/
public CompatibilityModeComposite(String id) {
super(id);
}
/**
* @see org.eclipse.jface.action.ControlContribution#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createControl(Composite parent) {
// initiate the composite for the compatibility elements
Composite comp = new Composite(parent, SWT.NONE);
comp.setLayout(new RowLayout(SWT.HORIZONTAL));
// label for displaying the status of the mode
final Label statusLabel = new Label(comp, SWT.NONE);
statusLabel.setImage(
CommonSharedImages.getImageRegistry().get(CommonSharedImages.IMG_SIGNED_YES));
// label for displaying the mode itself
final Label modeLabel = new Label(comp, SWT.NONE);
// Menu for mode selection on left click
IContributionItem popupMenu = new CompatibilityMenu();
final MenuManager mmanager = new MenuManager();
mmanager.add(popupMenu);
modeLabel.setMenu(mmanager.createContextMenu(modeLabel));
modeLabel.addMouseListener(new MouseListener() {
@Override
public void mouseDoubleClick(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseDown(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseUp(MouseEvent e) {
modeLabel.getMenu().setVisible(true);
}
});
// listener to update the mode label
modeListener = new ExclusiveExtensionListener<CompatibilityMode, CompatibilityModeFactory>() {
@Override
public void currentObjectChanged(final CompatibilityMode arg0,
final CompatibilityModeFactory arg1) {
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
@Override
public void run() {
modeLabel.setText(cs.getCurrentDefinition().getDisplayName());
}
});
}
};
cs.addListener(modeListener);
// listener for updating the mode status label
compListener = new CompatibilityServiceListener() {
@Override
public void compatibilityChanged(final boolean isCompatible,
List<Cell> incompatibleCells) {
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
@Override
public void run() {
if (isCompatible) {
statusLabel.setImage(CommonSharedImages.getImageRegistry()
.get(CommonSharedImages.IMG_SIGNED_YES));
statusLabel.setToolTipText("No incompatibility detected!");
}
if (!isCompatible) {
statusLabel.setImage(CommonSharedImages.getImageRegistry()
.get(CommonSharedImages.IMG_SIGNED_NO));
statusLabel.setToolTipText("Incompatibility detected!");
}
}
});
}
};
cs.addCompatibilityListener(compListener);
modeLabel.setText(cs.getCurrentDefinition().getDisplayName());
statusLabel.setToolTipText("No incompatibility detected!");
return comp;
}
/**
* @see org.eclipse.jface.action.ContributionItem#dispose()
*/
@Override
public void dispose() {
cs.removeListener(modeListener);
cs.removeCompatibilityListener(compListener);
super.dispose();
}
}